package ln.fxspringarchetype.util;

import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.ZoneOffset;
import java.time.format.DateTimeFormatter;
import java.util.Date;

/**
 * 有关时间日期互转的一些工具方法
 * String，Date，LocalDateTime
 */
public class DateTimeUtil {
    /**
     * 本地时区标识
     */
    public static final ZoneId ZONE_ID = ZoneId.systemDefault();

    /**
     * ISO日期时间格式化器
     * 格式样例 011-12-03T10:15:30
     */
    public static final DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormatter.ISO_DATE_TIME;

    /**
     * 从日期转换为本地日期时间
     *
     * @param date 日期
     * @return 本地日期时间
     */
    public static LocalDateTime dateToLocalDateTime(Date date) {
        Instant instant = date.toInstant();
        return LocalDateTime.ofInstant(instant, ZONE_ID);
    }


    /**
     * 本地日期时间转换为日期
     *
     * @param localDateTime 本地日期时间
     * @return 日期
     */
    public static Date localDateTimeToDate(LocalDateTime localDateTime) {
        Instant instant = localDateTime.toInstant(ZoneOffset.UTC);
        return Date.from(instant);
    }

    /**
     * 本地日期时间转换成ISO字符串
     *
     * @param localDateTime 本地日期时间
     * @return ISO字符串
     */
    public static String localDateTimeToString(LocalDateTime localDateTime) {
        return localDateTime.format(DATE_TIME_FORMATTER);
    }

    /**
     * ISO字符串转换为本地日期时间
     *
     * @param isoString ISO字符串
     * @return 本地日期时间
     */
    public static LocalDateTime stringToLocalDateTime(String isoString) {
        return LocalDateTime.parse(isoString, DATE_TIME_FORMATTER);
    }

    /**
     * 把日期转换成ISO字符串
     *
     * @param date 日期
     * @return ISO字符串
     */
    public static String dateToDateTimeString(Date date) {
        LocalDateTime localDateTime = dateToLocalDateTime(date);
        return localDateTimeToString(localDateTime);
    }

    /**
     * 从ISO字符串转换为日期
     *
     * @param dateTimeString ISO字符串
     * @return 日期
     */
    public static Date dateTimeStringToDate(String dateTimeString) {
        LocalDateTime localDateTime = stringToLocalDateTime(dateTimeString);
        return localDateTimeToDate(localDateTime);
    }
}
